package br.com.vti.sisp_sicrim.model.dao;

import java.lang.reflect.Field;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

import br.com.crud4j.core.model.Model;
import br.com.crud4j.core.model.dao.DAOImpl;
import br.com.vti.sisp_sicrim.model.entity.enums.Status;

/**
 *
 * @author ednardomatos
 */
@Repository("sispSicrimDao")
public class SispSicrimDaoImpl<E extends Model<? extends Number>> extends DAOImpl<E> {

    @PersistenceContext(unitName = "sispSicrimPU")
    private EntityManager entityManager;

    @Override
    protected EntityManager getEntityManager() {
        return this.entityManager;
    }
    
    @Override
    public void remover(E entidade) {
    	try {
    		entidade = super.buscarPorId(entidade);
			Field field = entidade.getClass().getDeclaredField("status");
			field.setAccessible(true);
			field.set(entidade, Status.INATIVO);
			
			super.atualizar(entidade);
		} catch (NoSuchFieldException e) {
		} catch (SecurityException e) {
		} catch (IllegalArgumentException e) {
		} catch (IllegalAccessException e) {
		}
    }
    
    @Override
    public List<E> listarPorExemplo(E entidade, Integer qtsRegistros) {
		try {
			Field field = entidade.getClass().getDeclaredField("status");
			field.setAccessible(true);
			field.set(entidade, Status.ATIVO);
		} catch (NoSuchFieldException e) {
		} catch (SecurityException e) {
		} catch (IllegalArgumentException e) {
		} catch (IllegalAccessException e) {
		}
		
		return super.listarPorExemplo(entidade, qtsRegistros);
    }
    
    @Override
    public E buscarPorId(E entidade) {
    	E aux = super.buscarPorId(entidade);
    	
    	try {
			Field field = entidade.getClass().getDeclaredField("status");
			field.setAccessible(true);
			Status status = (Status) field.get(aux);
			
			if(status == Status.INATIVO) {
				aux = null;
			}
			
		} catch (NoSuchFieldException e) {
		} catch (SecurityException e) {
		} catch (IllegalArgumentException e) {
		} catch (IllegalAccessException e) {
		}
    	
    	return aux;
    }
    
    
    @Override
    public void inserir(E entidade) {
    	try {
			Field field = entidade.getClass().getDeclaredField("status");
			field.setAccessible(true);
			field.set(entidade, Status.ATIVO);
			
    	} catch (NoSuchFieldException e) {
		} catch (SecurityException e) {
		} catch (IllegalArgumentException e) {
		} catch (IllegalAccessException e) {
		}
    	
    	super.inserir(entidade);
    }
    
    @Override
    public void atualizar(E entidade) {
    	try {
    		Field field = entidade.getClass().getDeclaredField("status");
			field.setAccessible(true);
			Status status = (Status) field.get(entidade);
			
			if(status == null) {
				field.set(entidade, Status.ATIVO);
			}
    	} catch (NoSuchFieldException e) {
		} catch (SecurityException e) {
		} catch (IllegalArgumentException e) {
		} catch (IllegalAccessException e) {
		}
    	
    	super.atualizar(entidade);
    }
}
